﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Castle.Windsor;
using laba2.Context;
using laba2.Entity;
using laba2.IoC;
using laba2.Repository.RepositoryImpl;
using laba2.Services;


namespace laba2
{
    class Program
    {
        private static IWindsorContainer container;
        private static CourseService courseService;
        private static TaskService taskService;
        private static StudentService studentService;
        static void Main(string[] args)
        {

            container = new WindsorContainer();
            container.Install(new ServiceInstaller());
            courseService = container.Resolve<CourseService>(); 
            taskService = container.Resolve<TaskService>();
            studentService = container.Resolve<StudentService>();

            string key = string.Empty;
            ShowMenu();
            while (key != "3")
            {
                key = Console.ReadLine();
                switch (key)
                {
                    case "1":
                        ShowCourseMenu();
                        break;
                    case "2":
                        ShowStudentMenu();
                        break;
                    default:
                        ShowMenu();
                        break;
                }
            }

            /*     courseService.AddCourse("ПрИС");
            courseService.SetEvaluation(1, 0, 55, "Неуд.");
            courseService.SetEvaluation(1, 56, 75, "Удовл.");
            courseService.SetEvaluation(1, 76, 85, "Хор.");
            courseService.SetEvaluation(1, 86, 100, "Отл.");*/

         

          /*  taskService.AddPracticalTask("Лаб.раб.1",20,15,"2013-03-01",1);
            taskService.AddBoundaryControl("Р.к.",20,17,"2013-02-23",1);
            taskService.AddFinalControl(20,30,"экзамен",1);
            taskService.SetRatingByDate(1, 6, 2);
            taskService.SetRatingByDate(1,12,1);*/
         /*   Console.WriteLine(courseService.GetById(0).Name );
            Console.WriteLine(courseService.GetById(0).Evaluations.Evaluations1[0].Evaluation1);
            Console.WriteLine(courseService.GetById(0).Evaluations.Evaluations1[1].Evaluation1);
            Console.WriteLine(courseService.GetById(0).Evaluations.Evaluations1[2].Evaluation1);
            Console.WriteLine(courseService.GetById(0).Evaluations.Evaluations1[3].Evaluation1);*/

           // Console.ReadKey();

           /* taskService.AddPracticalTask( "Лаба 1", 25, 15, "22.02.2013", 0);
            taskService.SetRatingByDate(0, 0, 0, 25);
            taskService.SetRatingByDate(0, 1, 3, 22);
            taskService.SetRatingByDate(0, 2, 5, 20);
            taskService.SetRatingByDate(0, 3, 7, 16);
            taskService.AddPracticalTask( "Лаба 2", 25, 15, "22.03.2013", 0);
            taskService.SetRatingByDate(1, 0, 0, 25);
            taskService.SetRatingByDate(1, 1, 3, 22);
            taskService.SetRatingByDate(1, 2, 5, 20);
            taskService.SetRatingByDate(1, 3, 7, 16);*/

        /*    Console.WriteLine(taskService.GetById(0).Name);
            Console.WriteLine(taskService.GetRatingForDate(0, "01.03.2013"));
            Console.WriteLine(taskService.GetById(1).Name);
            Console.WriteLine(taskService.GetRatingForDate(1, "22.03.2013"));
            */
           Console.WriteLine("end");
           
            
        }
        private static void ShowMenu()
        {
            Console.WriteLine("1. Курсы");
            Console.WriteLine("2. Студенты");
            Console.WriteLine("3. Выход");
        }
        private static void ShowCourseMenu()
        {
            Console.WriteLine("1. Добавить курс");
            Console.WriteLine("2. Изменить курс");
            Console.WriteLine("3. Назад");
            var key = Console.ReadLine();
            switch (key)
            {
                case "1":
                    Console.WriteLine("Введите название");
                    var name = Console.ReadLine();
                    courseService.AddCourse(name);
                    ShowCourseMenu();
                    break;
                case "2":
                    ShowCourseChangeMenu();
                    break;
                case "3":
                    ShowMenu();
                    break;
                default:
                    ShowCourseMenu();
                    break;

            }
        }
        private static void ShowCourseChangeMenu()
        {
            ShowCourses();
            int id = int.Parse(Console.ReadLine());
            Console.WriteLine("1. Добавить задание");
            Console.WriteLine("2. Добавить пересчет");
            Console.WriteLine("3. Назад");
            var key = Console.ReadLine();
            switch (key)
            {
                case "1":
                    ShowAddTaskMenu(id);
                    break;
                case "2":
                    Console.WriteLine("Введите минимальное значение");
                    int min =int.Parse( Console.ReadLine());
                    Console.WriteLine("Введите максимальное значение");
                    int max=int.Parse( Console.ReadLine());
                    Console.WriteLine("Введите оценку");
                    var eval=( Console.ReadLine());
                    courseService.SetEvaluation(id,min,max,eval);
                    ShowCourseChangeMenu();
                    break;
                case "3":
                    ShowCourseMenu();
                    break;
                default:
                    ShowCourseChangeMenu();
                    break;
            }
        }
        private static void ShowAddTaskMenu(int idCourse)
        { 
            Console.WriteLine("1. Добавить практическое задание");
            Console.WriteLine("2. Добавить рубежный контроль");
            Console.WriteLine("3. Добавить финальный контроль");
            Console.WriteLine("4. Назад");
            var key = Console.ReadLine();
            switch (key)
            {
                case "1":
                    Console.WriteLine("Введите название");
                    var name = Console.ReadLine();
                    Console.WriteLine("Введите максимальный балл");
                    var max = int.Parse(Console.ReadLine());
                    Console.WriteLine("Введите проходной балл");
                    var pas = int.Parse(Console.ReadLine());
                    Console.WriteLine("Введите дату");
                    var deadline = (Console.ReadLine());
                    taskService.AddPracticalTask(name, max, pas, deadline, idCourse);
                    ShowAddTaskMenu(idCourse);
                    break;
                case "2":
                    Console.WriteLine("Введите название");
                    var name1 = Console.ReadLine();
                    Console.WriteLine("Введите максимальный балл");
                    var max1 = int.Parse(Console.ReadLine());
                    Console.WriteLine("Введите проходной балл");
                    var pas1 = int.Parse(Console.ReadLine());
                    Console.WriteLine("Введите дату");
                    var deadline1 = (Console.ReadLine());
                    taskService.AddBoundaryControl(name1,max1,pas1,deadline1,idCourse);
                    ShowAddTaskMenu(idCourse);
                    break;
                case "3":
                    Console.WriteLine("Введите название");
                    var name2 = Console.ReadLine();
                    Console.WriteLine("Введите максимальный балл");
                    var max2 = int.Parse(Console.ReadLine());
                    Console.WriteLine("Введите проходной балл");
                    var pas2 = int.Parse(Console.ReadLine());
                    taskService.AddFinalControl(pas2, max2, name2, idCourse);
                    ShowAddTaskMenu(idCourse);
                    break;
                case "4":
                    ShowCourseChangeMenu();
                    break;
                default:
                    ShowAddTaskMenu(idCourse);
                    break;
            }

        }
        private static  void ShowStudentMenu()
        {
            Console.WriteLine("1. Добавить студента");
            Console.WriteLine("2. Изменить студента");
            Console.WriteLine("3. Назад");
            var key = Console.ReadLine();
            switch (key)
            {
                case "1":
                    Console.WriteLine("Введите имя");
                    var name = Console.ReadLine();
                    Console.WriteLine("Введите адрес");
                    var address = Console.ReadLine();
                    Console.WriteLine("Введите телефон");
                    var phone = Console.ReadLine();
                    Console.WriteLine("Введите e-mail");
                    var email = Console.ReadLine();
                    studentService.AddStudent(name,address,email,phone);
                    ShowStudentMenu();
                    break;
                case "2":
                    ShowCourses();
                    var idCourse = int.Parse(Console.ReadLine());
                    ShowStudents();
                    var idStudent = int.Parse(Console.ReadLine());
                    ShowStudentChangeMenu(idCourse,idStudent);
                    break;
                case "3":
                    ShowMenu();
                    break;
                default:
                    ShowStudentMenu();
                    break;
            }
        }
        private static void ShowStudentChangeMenu(int idCourse, int idStudent)
        {
            Console.WriteLine("1. Засчитать задание");
            Console.WriteLine("2. Просмотреть список задолженностей");
            Console.WriteLine("3. Получить предварительную оценку");
            Console.WriteLine("4. Назад");
            var key = Console.ReadLine();
            switch (key)
            {
                case "1":
                    ShowAchivementAddMenu(idCourse,idStudent);
                    break;
                case "2":
                    foreach (var task in studentService.GetListDebt(idStudent, idCourse))
                    {
                     Console.WriteLine(task.Name);   
                    }
                    ShowStudentChangeMenu(idCourse,idStudent);
                    break;
                case "3":
                    Console.WriteLine(courseService.GetEvaluation(idCourse,studentService.GetCurrentRating(idStudent,idCourse)));
                    ShowStudentChangeMenu(idCourse,idStudent);
                    break;
                case "4":
                    ShowStudentMenu();
                    break;
                default:
                    ShowStudentChangeMenu(idCourse,idStudent);
                    break;
            }
        }
        private static void ShowAchivementAddMenu(int idCourse, int idStudent)
        {
            ShowTasks(idCourse);
            int idTask = int.Parse(Console.ReadLine());
            Console.WriteLine("1. Засчитать практическое задание");
            Console.WriteLine("2. Засчитать промежуточный контроль");
            Console.WriteLine("3. Засчитать финальный контроль");
            Console.WriteLine("4. Назад");
            var key = Console.ReadLine();
            switch (key)
            {
                case "1":
                    Console.WriteLine("Введите дату");
                    var date =(Console.ReadLine());
                    Console.WriteLine("Введите оценку за качество");
                    var ratingForQuality = int.Parse(Console.ReadLine());
                    Console.WriteLine("Введите оценку за сроки(рекомендуемая )");//+taskService.GetRatingForDate(idTask,date));
                    var ratingForDate = int.Parse(Console.ReadLine());
                    studentService.AddPracticalTask(idTask, DateTime.Parse(date), ratingForQuality, ratingForDate,
                                                   idStudent);
                    ShowStudentChangeMenu(idCourse,idStudent);
                    break;
                case "2":
                    Console.WriteLine("Введите дату");
                    var date1 =(Console.ReadLine());
                    Console.WriteLine("Введите оценку за качество");
                    var rating = int.Parse(Console.ReadLine());
                    studentService.AddBoundaryControl(idTask,DateTime.Parse(date1),rating,idStudent);
                    ShowStudentChangeMenu(idCourse,idStudent);
                    break;
                case "3":
                    Console.WriteLine("Введите дату");
                    var date2 =(Console.ReadLine());
                    Console.WriteLine("Введите оценку за качество");
                    var rating2 = int.Parse(Console.ReadLine());
                    studentService.AddFinalControl(idTask,DateTime.Parse(date2),rating2,idStudent);
                    ShowStudentChangeMenu(idCourse,idStudent);
                    break;
                case "4":
                    ShowStudentChangeMenu(idCourse,idStudent);
                    break;
                default:
                    ShowStudentChangeMenu(idCourse, idStudent);
                    break;
            }
        }
        private static void ShowCourses()
        {
            foreach (var course in courseService.GetAll())
            {
                Console.WriteLine(course.Id+".  "+course.Name);
            }
            Console.WriteLine("Введите номер выбранного курса");
        }
        private static void ShowStudents()
        {
            foreach (var student in studentService.GetAll())
            {
                Console.WriteLine(student.Id+".  "+student.Name);
            }
            Console.WriteLine("Введите номер выбранного студента");
        }
        private static void ShowTasks(int idCourse)
        {
            foreach(var task in taskService.GetTaskByCourse(idCourse))
            {
                Console.WriteLine(task.Id+".  "+task.Name);
            }
            Console.WriteLine("Введите номер выбранноЙ задачи");
        }
    }
}
